import { httpClient } from '@/utils/http/axios';
import { ErrorMessageMode } from '#/axios';
import {
  RoleOutputDto,
  RoleNode,
  RoleOrganizationNode,
  RoleInputDto,
  RoleSetUserDto,
  RoleSetOrganizationDto,
  RoleSetModuleDto,
} from './model';
import { AjaxResult } from '@/api/model';
import { PageRequest, PageData } from '@/utils/common/types';

/** 管理-角色信息枚举 */
enum Api {
  /** 读取角色 */
  Read = '/api/admin/role/read',
  /** 读取角色节点 */
  ReadNode = '/api/admin/role/readNode',
  /** 获取角色树数据 */
  GetRoleNodes = '/api/admin/role/getRoleNodes',

  /** 读取角色[用户]树数据 */
  ReadUserRoles = '/api/admin/role/readUserRoles',
  /** 读取角色[组织机构]树数据 */
  ReadOrganizationRoles = '/api/admin/role/readOrganizationRoles',

  /** 新增角色 */
  Create = '/api/admin/role/create',
  /** 更新角色 */
  Update = '/api/admin/role/update',
  /** 删除角色 */
  Delete = '/api/admin/role/delete',

  /** 设置角色用户 */
  SetUsers = '/api/admin/role/setUsers',
  /** 设置角色组织机构 */
  SetOrganizations = '/api/admin/role/setOrganizations',

  /** 设置角色模块 */
  SetModules = '/api/admin/role/setModules',
}

//#region 读取角色
/**
 * 读取角色
 * @param request 分页请求
 * @param mode 错误消息模型
 */
export function readRoles(request: PageRequest, mode: ErrorMessageMode = 'message') {
  return httpClient.post<PageData<RoleOutputDto>>(
    {
      url: Api.Read,
      params: request,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 读取角色节点
/**
 * 读取角色节点
 * @param mode 错误消息模型
 */
export function readRoleNodes(mode: ErrorMessageMode = 'message') {
  return httpClient.get<RoleNode[]>(
    {
      url: Api.ReadNode,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 获取角色树数据
/**
 * 获取角色树数据
 * @param roleIds 已选择的角色编号
 * @param mode 错误消息模型
 */
export function getRoleNodes(roleIds: (string | bigint)[], mode: ErrorMessageMode = 'message') {
  return httpClient.post<RoleNode[]>(
    {
      url: Api.GetRoleNodes,
      params: roleIds,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion

//#region 读取角色[用户]树数据
/**
 * 读取角色[用户]树数据
 * @param userId 用户编号
 * @param mode 错误消息模型
 */
export function readUserRoles(userId: string | bigint, mode: ErrorMessageMode = 'message') {
  return httpClient.get<RoleNode[]>(
    {
      url: Api.ReadUserRoles,
      params: { userId: userId },
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 读取角色[组织机构]树数据
/**
 * 读取角色[组织机构]树数据
 * @param organizationId 组织机构编号
 * @param mode 错误消息模型
 */
export function readOrganizationRoles(
  organizationId: string | bigint,
  mode: ErrorMessageMode = 'message',
) {
  return httpClient.get<RoleOrganizationNode[]>(
    {
      url: Api.ReadOrganizationRoles,
      params: { organizationId: organizationId },
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion

//#region 新增角色
/**
 * 新增角色
 * @param dtos 新增角色信息
 * @param mode 错误消息模型
 */
export function createRoles(dtos: RoleInputDto[], mode: ErrorMessageMode = 'message') {
  return httpClient.post<AjaxResult>(
    {
      url: Api.Create,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 更新角色
/**
 * 更新角色
 * @param dtos 更新角色信息
 * @param mode 错误消息模型
 */
export function updateRoles(dtos: RoleInputDto[], mode: ErrorMessageMode = 'message') {
  return httpClient.post<AjaxResult>(
    {
      url: Api.Update,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 删除角色
/**
 * 删除角色
 * @param ids 要删除的角色编号
 * @param mode 错误消息模型
 */
export function deleteRoles(ids: (string | bigint)[], mode: ErrorMessageMode = 'message') {
  return httpClient.post<AjaxResult>(
    {
      url: Api.Delete,
      params: ids,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion

//#region 设置角色用户
/**
 * 设置角色用户
 * @param dtos 角色用户信息
 * @param mode 错误消息模型
 */
export function setRoleUsers(dtos: RoleSetUserDto, mode: ErrorMessageMode = 'message') {
  return httpClient.post<AjaxResult>(
    {
      url: Api.SetUsers,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
//#region 设置角色组织机构
/**
 * 设置角色组织机构
 * @param dtos 角色组织机构信息
 * @param mode 错误消息模型
 */
export function setRoleOrganizations(
  dtos: RoleSetOrganizationDto,
  mode: ErrorMessageMode = 'message',
) {
  return httpClient.post<AjaxResult>(
    {
      url: Api.SetOrganizations,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion

//#region 设置角色模块
/**
 * 设置角色模块
 * @param dtos 角色模块信息
 * @param mode 错误消息模型
 */
export function setRoleModules(dtos: RoleSetModuleDto, mode: ErrorMessageMode = 'message') {
  return httpClient.post<AjaxResult>(
    {
      url: Api.SetModules,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
//#endregion
